package org.soarsky.wealthchengdu.util;

import java.io.ByteArrayOutputStream;
import java.io.IOException;

import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.media.ThumbnailUtils;

/**
 * 使用较小的内存，来构建缩略图
 * 
 * @author yue
 * 
 */
public class ThumbnailUtil {

	/**
	 * 根据指定的图像路径和大小来获取缩略图 此方法有两点好处： 1.
	 * 使用较小的内存空间，第一次获取的bitmap实际上为null，只是为了读取宽度和高度，
	 * 第二次读取的bitmap是根据比例压缩过的图像，第三次读取的bitmap是所要的缩略图。 2.
	 * 缩略图对于原图像来讲没有拉伸，这里使用了2.2版本的新工具ThumbnailUtils，使 用这个工具生成的图像不会被拉伸。
	 * 
	 * @param imagePath
	 *            图像的路径
	 * @param width
	 *            指定输出图像的宽度
	 * @param height
	 *            指定输出图像的高度
	 * @return 生成的缩略图
	 */
	public static final Bitmap getImageThumbnail(byte[] data, int width,
			int height) {
		Bitmap bitmap = null;
		BitmapFactory.Options opts = new BitmapFactory.Options();
		opts.inJustDecodeBounds = true;
		// 获取这个图片的宽和高，注意此处的bitmap为null
		BitmapFactory.decodeByteArray(data, 0, data.length, opts);
		opts.inJustDecodeBounds = false; // 设为 false

		// 计算缩放比
		int h = opts.outHeight;
		int w = opts.outWidth;
		int beWidth = w / width;
		int beHeight = h / height;
		int be = 1;
		if (beWidth < beHeight) {
			be = beWidth;
		} else {
			be = beHeight;
		}
		if (be <= 0) {
			be = 1;
		}
		opts.inSampleSize = be;
		// 重新读入图片，读取缩放后的bitmap，注意这次要把options.inJustDecodeBounds 设为 false
		bitmap = BitmapFactory.decodeByteArray(data, 0, data.length, opts);
		if (opts.outWidth <= width && opts.outHeight <= height) {
			return bitmap;
		}
		// 利用ThumbnailUtils来创建缩略图，这里要指定要缩放哪个Bitmap对象
		bitmap = ThumbnailUtils.extractThumbnail(bitmap, width, height,
				ThumbnailUtils.OPTIONS_RECYCLE_INPUT);
		return bitmap;
	}

	/**
	 * 获取缩略图二进制数组
	 * 
	 * @param data
	 * @param width
	 * @param height
	 * @return
	 */
	public static final byte[] getImageThumbnailBytes(byte[] data, int width,
			int height) {
		try {
			Bitmap bm = getImageThumbnail(data, width, height);
			ByteArrayOutputStream baos = new ByteArrayOutputStream();
			bm.compress(Bitmap.CompressFormat.JPEG, 100, baos);
			byte[] bmBytes = baos.toByteArray();
			baos.close();
			bm.recycle();
			return bmBytes;
		} catch (IOException e) {
			e.printStackTrace();
		}
		return null;
	}
}
